/**
 * @description RunningHub API常用工具方法
 */
import runningHubService from './runningHubService';

// 默认API Key
const DEFAULT_API_KEY = '4067f5cbd5da40359602adaa342ab82c';

/**
 * @description 初始化RunningHub服务
 * @param {String} apikey 自定义API Key，不传则使用默认值或存储的值
 */
export function initRunningHub(apikey) {
  // 优先使用传入的apikey，其次使用默认值，最后使用存储的值
  const key = apikey || DEFAULT_API_KEY || uni.getStorageSync('runningHubApiKey');
  if (key) {
    runningHubService.setApiKey(key);
    return true;
  }
  return false;
}

/**
 * @description 生成图片的简易方法
 * @param {Object} options 生成选项
 * @param {String} options.prompt 正向提示词
 * @param {String} options.negativePrompt 负向提示词
 * @param {String} options.workflowApiId 工作流ID
 * @param {Function} options.onSuccess 成功回调
 * @param {Function} options.onError 失败回调
 * @param {Function} options.onComplete 完成回调，无论成功失败
 */
export function generateImage(options) {
  const {
    prompt,
    negativePrompt = '',
    workflowApiId = '1', // 默认工作流ID
    onSuccess,
    onError,
    onComplete
  } = options;

  // 确保初始化
  initRunningHub();

  // 显示加载提示
  uni.showLoading({
    title: '生成中...',
    mask: true
  });

  // 创建任务参数
  const params = {
    workflowApiId,
    prompt,
    negativePrompt
  };

  // 创建任务
  runningHubService.createTask(params)
    .then(res => {
      if (res.code === 0 && res.data) {
        const taskId = res.data.taskId;
        // 创建成功，查询结果
        return queryImageResult(taskId);
      } else {
        throw new Error(res.msg || '创建任务失败');
      }
    })
    .then(imageResult => {
      uni.hideLoading();
      if (onSuccess) onSuccess(imageResult);
    })
    .catch(error => {
      uni.hideLoading();
      uni.showToast({
        title: error.message || '生成图片失败',
        icon: 'none'
      });
      if (onError) onError(error);
    })
    .finally(() => {
      if (onComplete) onComplete();
    });
}

/**
 * @description 轮询查询图片生成结果
 * @param {String} taskId 任务ID
 * @param {Number} maxAttempts 最大尝试次数
 * @param {Number} interval 轮询间隔(毫秒)
 * @returns {Promise} 图片结果
 */
export function queryImageResult(taskId, maxAttempts = 30, interval = 2000) {
  return new Promise((resolve, reject) => {
    let attempts = 0;

    // 轮询函数
    function poll() {
      attempts++;
      runningHubService.queryTaskResult(taskId)
        .then(res => {
          if (res.code === 0) {
            // 检查任务是否完成
            if (res.data && res.data.length > 0) {
              // 任务完成，返回结果
              resolve(res.data);
            } else if (attempts < maxAttempts) {
              // 继续轮询
              setTimeout(poll, interval);
            } else {
              // 超过最大尝试次数
              reject(new Error('生成超时，请稍后查看结果'));
            }
          } else {
            // 查询失败
            reject(new Error(res.msg || '查询结果失败'));
          }
        })
        .catch(error => {
          if (attempts < maxAttempts) {
            // 出错后继续尝试
            setTimeout(poll, interval);
          } else {
            reject(error);
          }
        });
    }

    // 开始轮询
    poll();
  });
}

/**
 * @description 上传图片并返回URL
 * @param {Object} options 上传选项
 * @param {Boolean} options.chooseImage 是否选择图片
 * @param {String} options.filePath 文件路径(当chooseImage为false时必传)
 * @param {Function} options.onSuccess 成功回调
 * @param {Function} options.onError 失败回调
 * @param {Function} options.onComplete 完成回调
 */
export function uploadImageToRunningHub(options) {
  const {
    chooseImage = true,
    filePath,
    onSuccess,
    onError,
    onComplete
  } = options;

  // 确保初始化
  initRunningHub();

  // 选择图片上传流程
  function uploadProcess(path) {
    uni.showLoading({
      title: '上传中...',
      mask: true
    });

    runningHubService.uploadResourceFile(path)
      .then(res => {
        uni.hideLoading();
        if (res.code === 0 && res.data) {
          const fileUrl = res.data.fileUrl;
          if (onSuccess) onSuccess(fileUrl, res);
        } else {
          throw new Error(res.msg || '上传失败');
        }
      })
      .catch(error => {
        uni.hideLoading();
        uni.showToast({
          title: error.message || '上传失败',
          icon: 'none'
        });
        if (onError) onError(error);
      })
      .finally(() => {
        if (onComplete) onComplete();
      });
  }

  // 判断是否需要选择图片
  if (chooseImage) {
    uni.chooseImage({
      count: 1,
      success: (res) => {
        const tempFilePath = res.tempFilePaths[0];
        uploadProcess(tempFilePath);
      },
      fail: (error) => {
        if (onError) onError(error);
        if (onComplete) onComplete();
      }
    });
  } else if (filePath) {
    uploadProcess(filePath);
  } else {
    const error = new Error('未指定文件路径');
    if (onError) onError(error);
    if (onComplete) onComplete();
  }
}

/**
 * @description 同时预设多个任务
 * @param {Array} tasks 任务数组
 * @returns {Promise} 所有任务的结果
 */
export function batchCreateTasks(tasks) {
  // 确保初始化
  initRunningHub();

  const promises = tasks.map(task => {
    return runningHubService.createTask({
      workflowApiId: task.workflowApiId || '1',
      prompt: task.prompt,
      negativePrompt: task.negativePrompt || ''
    });
  });

  return Promise.all(promises);
}

// 导出默认对象
export default {
  initRunningHub,
  generateImage,
  queryImageResult,
  uploadImageToRunningHub,
  batchCreateTasks,
  service: runningHubService
}; 